C.S.Burner 🪙 ━►🔥GIT Node
tests/backend/test_page_node.py dev (2bf00cb3) Text, 39.19 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72import T7ee787os
Tff7b72import T7ee787shutil
Tff7b72import T7ee787tempfile
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72import T7ee787pytest
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3normalize_page_filename
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffnode_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3d Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkdtempTb4b4b4(Tb4b4b4)
Tff7b72yield Te6edf3d
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Te6edf3dTb4b4b4, Te6edf3ignore_errorsTff7b72=Tff7b72TrueTb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffmock_rnsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.page_node.RNSTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mockTb4b4b4:
Te6edf3mock_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_identityTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x01Ta5d6ff" Tff7b72* T79c0ff16
Te6edf3mock_identityTff7b72.Td2a8ffget_public_keyTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x02Ta5d6ff" Tff7b72* T79c0ff64
Te6edf3mock_destination Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_destinationTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x03Ta5d6ff" Tff7b72* T79c0ff16
Te6edf3mockTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3mock_identity
Te6edf3mockTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3mock_identity
Te6edf3mockTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3mock_destination
Te6edf3mockTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffIN Tff7b72= T79c0ff1
Te6edf3mockTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLE Tff7b72= T79c0ff0
Te6edf3mockTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALL Tff7b72= T79c0ff0xFF
Te6edf3mockTff7b72.Td2a8ffTransport Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mockTff7b72.Td2a8ffvendor Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mockTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutils Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mockTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Tff7b72yield Te6edf3mockTb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3mock_destination
Tff7b72def Td2a8ff_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3_Tb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Tff7b72return Te6edf3PageNodeTb4b4b4(
Te6edf3node_idTff7b72=Ta5d6ff"Ta5d6fftest-node-1Ta5d6ff"Tb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffTest NodeTa5d6ff"Tb4b4b4,
Te6edf3base_dirTff7b72=Te6edf3node_dirTb4b4b4,
Te6edf3identityTff7b72=Te6edf3mock_identityTb4b4b4,
Tb4b4b4)
Tff7b72class T56d364TestPageNodeSetupTb4b4b4:
Tff7b72def Td2a8fftest_setup_creates_directoriesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4)
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffrunning Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_setup_returns_destination_hash_hexTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3result Tff7b72= Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3resultTb4b4b4, Tffa657strTb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4) Tff7b72== T79c0ff32
Tff7b72def Td2a8fftest_setup_creates_identity_when_noneTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3rns_mockTb4b4b4, Te6edf3_Tb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Te6edf3node Tff7b72= Te6edf3PageNodeTb4b4b4(
Te6edf3node_idTff7b72=Ta5d6ff"Ta5d6fftest-node-2Ta5d6ff"Tb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffNo Identity NodeTa5d6ff"Tb4b4b4,
Te6edf3base_dirTff7b72=Te6edf3node_dirTb4b4b4,
Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3rns_mockTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_setup_loads_identity_from_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3rns_mockTb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Te6edf3identity_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3node_dirTb4b4b4, Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3identity_pathTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6fffakeTa5d6ff"Tb4b4b4)
Te6edf3node Tff7b72= Te6edf3PageNodeTb4b4b4(
Te6edf3node_idTff7b72=Ta5d6ff"Ta5d6fftest-node-3Ta5d6ff"Tb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffFile Identity NodeTa5d6ff"Tb4b4b4,
Te6edf3base_dirTff7b72=Te6edf3node_dirTb4b4b4,
Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3rns_mockTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTff7b72.Td2a8ffassert_called_withTb4b4b4(Te6edf3identity_pathTb4b4b4)
Tff7b72def Td2a8fftest_setup_registers_link_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3mock_destTff7b72.Td2a8ffset_link_established_callbackTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_setup_calls_ensure_local_pathTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3rns_mockTb4b4b4, Te6edf3_Tb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3rns_mockTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrememberTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Tff7b72class T56d364TestPageNodeTeardownTb4b4b4:
Tff7b72def Td2a8fftest_teardown_sets_running_falseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffrunning Tff7b72is Tff7b72False
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffdestination Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_teardown_deregisters_handlersTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6fftest.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6fftest.txtTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3nodeTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3mock_destTff7b72.Td2a8ffderegister_request_handlerTff7b72.Td2a8ffcall_count Tff7b72>Tff7b72= T79c0ff2
Tff7b72def Td2a8fftest_teardown_clears_active_linksTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3mock_link Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffactive_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3mock_linkTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffactive_linksTb4b4b4) Tff7b72== T79c0ff0
Te6edf3mock_linkTff7b72.Td2a8ffteardownTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tff7b72class T56d364TestPageNodeAnnounceTb4b4b4:
Tff7b72def Td2a8fftest_announce_calls_destination_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3mock_destTff7b72.Td2a8ffannounceTff7b72.Td2a8ffreset_mockTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Te6edf3mock_destTff7b72.Td2a8ffannounceTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_announce_skips_when_not_runningTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3mock_destTff7b72.Td2a8ffannounceTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_announce_passes_name_as_app_dataTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3nodeTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Te6edf3call_kwargs Tff7b72= Te6edf3mock_destTff7b72.Td2a8ffannounceTff7b72.Td2a8ffcall_args
Tff7b72assert Te6edf3call_kwargsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffapp_dataTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffTest NodeTa5d6ff"
Tff7b72def Td2a8fftest_setup_announces_immediately_when_enabledTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3mock_destTff7b72.Td2a8ffannounceTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_setup_skips_announce_when_disabledTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3_Tb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Te6edf3node Tff7b72= Te6edf3PageNodeTb4b4b4(
Te6edf3node_idTff7b72=Ta5d6ff"Ta5d6fftest-node-disabledTa5d6ff"Tb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffDisabled NodeTa5d6ff"Tb4b4b4,
Te6edf3base_dirTff7b72=Te6edf3node_dirTb4b4b4,
Te6edf3identityTff7b72=Te6edf3mock_identityTb4b4b4,
Te6edf3announce_enabledTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3mock_destTff7b72.Td2a8ffannounceTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_announce_records_last_announced_atTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8fflast_announced_at Tff7b72is Tff7b72None
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8fflast_announced_at Tff7b72is Tff7b72not Tff7b72None
Tff7b72def Td2a8fftest_announce_does_not_update_last_announced_at_when_not_runningTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rns
Tb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8fflast_announced_at Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_announce_invokes_on_announce_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3_Tb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Te6edf3calls Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3node Tff7b72= Te6edf3PageNodeTb4b4b4(
Te6edf3node_idTff7b72=Ta5d6ff"Ta5d6fftest-node-cbTa5d6ff"Tb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffCallback NodeTa5d6ff"Tb4b4b4,
Te6edf3base_dirTff7b72=Te6edf3node_dirTb4b4b4,
Te6edf3identityTff7b72=Te6edf3mock_identityTb4b4b4,
Te6edf3on_announceTff7b72=Te6edf3callsTff7b72.Td2a8ffappendTb4b4b4,
Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3calls Tff7b72== Tb4b4b4[Te6edf3nodeTb4b4b4]
Tff7b72def Td2a8fftest_announce_callback_exceptions_are_suppressedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3_Tb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Tff7b72def Td2a8ffboomTb4b4b4(Te6edf3_nodeTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffboomTa5d6ff"Tb4b4b4)
Te6edf3node Tff7b72= Te6edf3PageNodeTb4b4b4(
Te6edf3node_idTff7b72=Ta5d6ff"Ta5d6fftest-node-cb-boomTa5d6ff"Tb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffBoom NodeTa5d6ff"Tb4b4b4,
Te6edf3base_dirTff7b72=Te6edf3node_dirTb4b4b4,
Te6edf3identityTff7b72=Te6edf3mock_identityTb4b4b4,
Te6edf3on_announceTff7b72=Te6edf3boomTb4b4b4,
Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4) T8b949e# must not raise
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffrunning Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_teardown_cancels_announce_timerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_announce_timer Tff7b72is Tff7b72not Tff7b72None
Te6edf3nodeTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_announce_timer Tff7b72is Tff7b72None
Tff7b72class T56d364TestPageNodeAnnounceIntervalTb4b4b4:
Tff7b72def Td2a8fftest_normalize_defaults_when_noneTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Tb4b4b4(
Te6edf3DEFAULT_ANNOUNCE_INTERVAL_SECONDSTb4b4b4,
Te6edf3normalize_announce_interval_secondsTb4b4b4,
Tb4b4b4)
Tff7b72assert Tb4b4b4(
Te6edf3normalize_announce_interval_secondsTb4b4b4(Tff7b72NoneTb4b4b4)
Tff7b72== Te6edf3DEFAULT_ANNOUNCE_INTERVAL_SECONDS
Tb4b4b4)
Tff7b72def Td2a8fftest_normalize_zero_or_negative_disablesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3normalize_announce_interval_seconds
Tff7b72assert Te6edf3normalize_announce_interval_secondsTb4b4b4(T79c0ff0Tb4b4b4) Tff7b72== T79c0ff0
Tff7b72assert Te6edf3normalize_announce_interval_secondsTb4b4b4(Tff7b72-T79c0ff30Tb4b4b4) Tff7b72== T79c0ff0
Tff7b72def Td2a8fftest_normalize_clamps_to_min_and_maxTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Tb4b4b4(
Te6edf3MAX_ANNOUNCE_INTERVAL_SECONDSTb4b4b4,
Te6edf3MIN_ANNOUNCE_INTERVAL_SECONDSTb4b4b4,
Te6edf3normalize_announce_interval_secondsTb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3normalize_announce_interval_secondsTb4b4b4(T79c0ff1Tb4b4b4) Tff7b72== Te6edf3MIN_ANNOUNCE_INTERVAL_SECONDS
Tff7b72assert Tb4b4b4(
Te6edf3normalize_announce_interval_secondsTb4b4b4(T79c0ff999999Tb4b4b4) Tff7b72== Te6edf3MAX_ANNOUNCE_INTERVAL_SECONDS
Tb4b4b4)
Tff7b72def Td2a8fftest_normalize_invalid_type_returns_defaultTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Tb4b4b4(
Te6edf3DEFAULT_ANNOUNCE_INTERVAL_SECONDSTb4b4b4,
Te6edf3normalize_announce_interval_secondsTb4b4b4,
Tb4b4b4)
Tff7b72assert Tb4b4b4(
Te6edf3normalize_announce_interval_secondsTb4b4b4(Ta5d6ff"Ta5d6ffnot-a-numberTa5d6ff"Tb4b4b4)
Tff7b72== Te6edf3DEFAULT_ANNOUNCE_INTERVAL_SECONDS
Tb4b4b4)
Tff7b72def Td2a8fftest_node_defaults_to_default_intervalTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3DEFAULT_ANNOUNCE_INTERVAL_SECONDS
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffannounce_interval_seconds Tff7b72== Te6edf3DEFAULT_ANNOUNCE_INTERVAL_SECONDS
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffannounce_enabled Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_node_clamps_custom_interval_on_constructionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3_Tb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Te6edf3node Tff7b72= Te6edf3PageNodeTb4b4b4(
Te6edf3node_idTff7b72=Ta5d6ff"Ta5d6fftest-node-clampTa5d6ff"Tb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffClamp NodeTa5d6ff"Tb4b4b4,
Te6edf3base_dirTff7b72=Te6edf3node_dirTb4b4b4,
Te6edf3identityTff7b72=Te6edf3mock_identityTb4b4b4,
Te6edf3announce_interval_secondsTff7b72=T79c0ff5Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffannounce_interval_seconds Tff7b72== T79c0ff60
Tff7b72def Td2a8fftest_setup_starts_announce_timer_when_enabledTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_announce_timer Tff7b72is Tff7b72not Tff7b72None
Tff7b72def Td2a8fftest_setup_skips_timer_when_disabledTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3_Tb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Te6edf3node Tff7b72= Te6edf3PageNodeTb4b4b4(
Te6edf3node_idTff7b72=Ta5d6ff"Ta5d6fftest-node-no-timerTa5d6ff"Tb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffNo Timer NodeTa5d6ff"Tb4b4b4,
Te6edf3base_dirTff7b72=Te6edf3node_dirTb4b4b4,
Te6edf3identityTff7b72=Te6edf3mock_identityTb4b4b4,
Te6edf3announce_enabledTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_announce_timer Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_setup_skips_timer_when_interval_zeroTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3_Tb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Te6edf3node Tff7b72= Te6edf3PageNodeTb4b4b4(
Te6edf3node_idTff7b72=Ta5d6ff"Ta5d6fftest-node-zero-intervalTa5d6ff"Tb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffZero Interval NodeTa5d6ff"Tb4b4b4,
Te6edf3base_dirTff7b72=Te6edf3node_dirTb4b4b4,
Te6edf3identityTff7b72=Te6edf3mock_identityTb4b4b4,
Te6edf3announce_interval_secondsTff7b72=T79c0ff0Tb4b4b4,
Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_announce_timer Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_announce_timer_fire_reannounces_and_reschedulesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3mock_destTff7b72.Td2a8ffannounceTff7b72.Td2a8ffreset_mockTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ff_announce_timer_fireTb4b4b4(Tb4b4b4)
Te6edf3mock_destTff7b72.Td2a8ffannounceTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_announce_timer Tff7b72is Tff7b72not Tff7b72None
Tff7b72def Td2a8fftest_announce_timer_fire_noop_when_disabled_meanwhileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3nodeTff7b72.Td2a8ffannounce_enabled Tff7b72= Tff7b72False
Te6edf3mock_destTff7b72.Td2a8ffannounceTff7b72.Td2a8ffreset_mockTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ff_announce_timer_fireTb4b4b4(Tb4b4b4)
Te6edf3mock_destTff7b72.Td2a8ffannounceTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_announce_timer Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_set_announce_settings_updates_enabled_and_intervalTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rns
Tb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_announce_settingsTb4b4b4(Te6edf3announce_enabledTff7b72=Tff7b72TrueTb4b4b4, Te6edf3announce_interval_secondsTff7b72=T79c0ff120Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffannounce_enabled Tff7b72is Tff7b72True
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffannounce_interval_seconds Tff7b72== T79c0ff120
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_announce_timer Tff7b72is Tff7b72not Tff7b72None
Tff7b72def Td2a8fftest_set_announce_settings_disable_cancels_timerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_announce_settingsTb4b4b4(Te6edf3announce_enabledTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffannounce_enabled Tff7b72is Tff7b72False
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_announce_timer Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_set_announce_settings_interval_zero_cancels_timerTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rns
Tb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_announce_settingsTb4b4b4(Te6edf3announce_interval_secondsTff7b72=T79c0ff0Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffannounce_interval_seconds Tff7b72== T79c0ff0
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_announce_timer Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_set_announce_settings_partial_update_keeps_other_fieldTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rns
Tb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_announce_settingsTb4b4b4(Te6edf3announce_interval_secondsTff7b72=T79c0ff300Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffannounce_enabled Tff7b72is Tff7b72True
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffannounce_interval_seconds Tff7b72== T79c0ff300
Tff7b72class T56d364TestPageNodePagesTb4b4b4:
Tff7b72def Td2a8fftest_add_page_writes_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3name Tff7b72= Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffhelloTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHello WorldTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffhello.muTa5d6ff"
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Ta5d6ff"Ta5d6ffhello.muTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72assert Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffHello WorldTa5d6ff"
Tff7b72def Td2a8fftest_add_page_appends_mu_extensionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6fftestTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fftest.muTa5d6ff"
Tff7b72def Td2a8fftest_add_page_preserves_mu_extensionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6fftest.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fftest.muTa5d6ff"
Tff7b72def Td2a8fftest_add_page_accepts_md_txt_htmlTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffnotes.mdTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff# xTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffnotes.mdTa5d6ff"
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffreadme.txtTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffplainTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffreadme.txtTa5d6ff"
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffstatic.htmlTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff<p>a</p>Ta5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffstatic.htmlTa5d6ff"
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Ta5d6ff"Ta5d6ffnotes.mdTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/page/notes.mdTa5d6ff" Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_page_paths
Tff7b72def Td2a8fftest_add_page_rejects_unknown_extensionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffbad.exeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_remove_page_invalid_extension_returns_falseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_pageTb4b4b4(Ta5d6ff"Ta5d6ffbad.exeTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_get_page_content_invalid_extension_returns_noneTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffget_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffbad.exeTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_setup_skips_unlisted_page_filesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Ta5d6ff"Ta5d6ffjunk.exeTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/page/junk.exeTa5d6ff" Tff7b72not Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_page_paths
Tff7b72def Td2a8fftest_add_page_registers_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4)
Te6edf3mock_destTff7b72.Td2a8ffregister_request_handlerTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/page/index.muTa5d6ff" Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_page_paths
Tff7b72def Td2a8fftest_remove_page_deletes_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffdeleteme.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffgoneTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_pageTb4b4b4(Ta5d6ff"Ta5d6ffdeleteme.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Ta5d6ff"Ta5d6ffdeleteme.muTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_remove_nonexistent_page_returns_falseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_pageTb4b4b4(Ta5d6ff"Ta5d6ffnope.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_list_pagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffb.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffa.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4)
Te6edf3pages Tff7b72= Te6edf3nodeTff7b72.Td2a8fflist_pagesTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3pages Tff7b72== Tb4b4b4[
Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffa.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffexecutableTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4}Tb4b4b4,
Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffb.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffexecutableTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4}Tb4b4b4,
Tb4b4b4]
Tff7b72def Td2a8fftest_get_page_contentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHello MeshTa5d6ff"Tb4b4b4)
Te6edf3content Tff7b72= Te6edf3nodeTff7b72.Td2a8ffget_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3content Tff7b72== Ta5d6ff"Ta5d6ffHello MeshTa5d6ff"
Tff7b72def Td2a8fftest_get_page_content_nonexistentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffget_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffnope.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72class T56d364TestPageNodeFilesTb4b4b4:
Tff7b72def Td2a8fftest_add_file_writes_binaryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3name Tff7b72= Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffdoc.pdfTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Tffea00\x00Tffea00\x01Tffea00\x02Ta5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffdoc.pdfTa5d6ff"
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4, Ta5d6ff"Ta5d6ffdoc.pdfTa5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72assert Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ffbTa5d6ff"Tffea00\x00Tffea00\x01Tffea00\x02Ta5d6ff"
Tff7b72def Td2a8fftest_add_file_writes_bytearrayTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3name Tff7b72= Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffupload.binTa5d6ff"Tb4b4b4, Tffa657bytearrayTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\xdeTffea00\xadTffea00\xbeTffea00\xefTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffupload.binTa5d6ff"
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4, Ta5d6ff"Ta5d6ffupload.binTa5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72assert Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ffbTa5d6ff"Tffea00\xdeTffea00\xadTffea00\xbeTffea00\xefTa5d6ff"
Tff7b72def Td2a8fftest_add_file_registers_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffinfo.txtTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/file/info.txtTa5d6ff" Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_file_paths
Tff7b72def Td2a8fftest_remove_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffrm.binTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Tffea00\xffTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_fileTb4b4b4(Ta5d6ff"Ta5d6ffrm.binTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4, Ta5d6ff"Ta5d6ffrm.binTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_remove_nonexistent_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_fileTb4b4b4(Ta5d6ff"Ta5d6ffnope.binTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_list_filesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffb.txtTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffbbTa5d6ff"Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffa.txtTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4)
Te6edf3files Tff7b72= Te6edf3nodeTff7b72.Td2a8fflist_filesTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3filesTb4b4b4) Tff7b72== T79c0ff2
Tff7b72assert Te6edf3filesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffa.txtTa5d6ff"
Tff7b72assert Te6edf3filesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffb.txtTa5d6ff"
Tff7b72assert Te6edf3filesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1
Tff7b72assert Te6edf3filesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff2
Tff7b72class T56d364TestPageNodeRespondersTb4b4b4:
Tff7b72def Td2a8fftest_page_responder_returns_contentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpage contentTa5d6ff"Tb4b4b4)
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_page_responderTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/page/index.muTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffreq1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflink1Ta5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72assert Te6edf3result Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffpage contentTa5d6ff"
Tff7b72def Td2a8fftest_page_responder_records_remote_identityTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4)
Te6edf3rid Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ridTff7b72.Td2a8ffhash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ffefTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_page_responderTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4)
Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/page/index.muTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffreq1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflink1Ta5d6ff"Tb4b4b4, Te6edf3ridTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffunique_connectionsTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1
Tff7b72def Td2a8fftest_page_responder_missing_returns_noneTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_page_responderTb4b4b4(Ta5d6ff"Ta5d6ffmissing.muTa5d6ff"Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/page/missing.muTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffreq1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflink1Ta5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72assert Te6edf3result Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_file_responder_returns_listTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffdata.binTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Tffea00\x01Tffea00\x02Tffea00\x03Ta5d6ff"Tb4b4b4)
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_file_responderTb4b4b4(Ta5d6ff"Ta5d6ffdata.binTa5d6ff"Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/file/data.binTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffreq1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflink1Ta5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3resultTb4b4b4, Tffa657listTb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4) Tff7b72== T79c0ff2
Te6edf3file_handle Tff7b72= Te6edf3resultTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3metadata Tff7b72= Te6edf3resultTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72assert Te6edf3file_handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ffbTa5d6ff"Tffea00\x01Tffea00\x02Tffea00\x03Ta5d6ff"
Tff7b72assert Te6edf3metadataTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffdata.binTa5d6ff"
Te6edf3file_handleTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_file_responder_increments_statsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6fff.txtTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffhelloTa5d6ff"Tb4b4b4)
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_file_responderTb4b4b4(Ta5d6ff"Ta5d6fff.txtTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_statsTb4b4b4[Ta5d6ff"Ta5d6fffiles_servedTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff0
Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/file/f.txtTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_statsTb4b4b4[Ta5d6ff"Ta5d6fffiles_servedTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1
Te6edf3result Tff7b72= Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/file/f.txtTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3resultTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_statsTb4b4b4[Ta5d6ff"Ta5d6fffiles_servedTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff2
Tff7b72class T56d364TestPageNodeConfigTb4b4b4:
Tff7b72def Td2a8fftest_save_and_load_configTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsave_configTb4b4b4(Tb4b4b4)
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3config Tff7b72= Te6edf3PageNodeTff7b72.Td2a8ffload_configTb4b4b4(Te6edf3node_dirTb4b4b4)
Tff7b72assert Te6edf3config Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffnode_idTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fftest-node-1Ta5d6ff"
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffTest NodeTa5d6ff"
Tff7b72def Td2a8fftest_load_config_missingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Tff7b72assert Te6edf3PageNodeTff7b72.Td2a8ffload_configTb4b4b4(Te6edf3node_dirTb4b4b4) Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_save_config_persists_announce_settingsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_announce_settingsTb4b4b4(
Te6edf3announce_enabledTff7b72=Tff7b72FalseTb4b4b4, Te6edf3announce_interval_secondsTff7b72=T79c0ff120
Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsave_configTb4b4b4(Tb4b4b4)
Te6edf3config Tff7b72= Te6edf3PageNodeTff7b72.Td2a8ffload_configTb4b4b4(Te6edf3node_dirTb4b4b4)
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffannounce_enabledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffannounce_interval_secondsTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff120
Tff7b72def Td2a8fftest_save_config_defaults_announce_settingsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Tb4b4b4(
Te6edf3DEFAULT_ANNOUNCE_INTERVAL_SECONDSTb4b4b4,
Te6edf3PageNodeTb4b4b4,
Tb4b4b4)
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsave_configTb4b4b4(Tb4b4b4)
Te6edf3config Tff7b72= Te6edf3PageNodeTff7b72.Td2a8ffload_configTb4b4b4(Te6edf3node_dirTb4b4b4)
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffannounce_enabledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffannounce_interval_secondsTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3DEFAULT_ANNOUNCE_INTERVAL_SECONDS
Tff7b72def Td2a8fftest_save_config_persists_executable_pages_enabledTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_executable_pages_enabledTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsave_configTb4b4b4(Tb4b4b4)
Te6edf3config Tff7b72= Te6edf3PageNodeTff7b72.Td2a8ffload_configTb4b4b4(Te6edf3node_dirTb4b4b4)
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffexecutable_pages_enabledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffexecutable_page_namesTa5d6ff"Tb4b4b4] Tff7b72== Tb4b4b4[Tb4b4b4]
Tff7b72def Td2a8fftest_save_config_persists_executable_page_namesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffstaticTa5d6ff"Tb4b4b4, Te6edf3executableTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3config Tff7b72= Te6edf3PageNodeTff7b72.Td2a8ffload_configTb4b4b4(Te6edf3node_dirTb4b4b4)
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffexecutable_page_namesTa5d6ff"Tb4b4b4] Tff7b72== Tb4b4b4[Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4]
Tff7b72class T56d364TestPageNodeStatusTb4b4b4:
Tff7b72def Td2a8fftest_get_statusTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhiTa5d6ff"Tb4b4b4)
Te6edf3status Tff7b72= Te6edf3nodeTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffnode_idTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fftest-node-1Ta5d6ff"
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffTest NodeTa5d6ff"
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Ta5d6ff"Ta5d6ffindex.muTa5d6ff" Tff7b72in Tb4b4b4[Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3p Tff7b72in Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffpagesTa5d6ff"Tb4b4b4]Tb4b4b4]
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffstatsTa5d6ff"Tb4b4b4]Tb4b4b4, Tffa657dictTb4b4b4)
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffunique_connectionsTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff0
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffuptime_secondsTa5d6ff"Tb4b4b4] Tff7b72>Tff7b72= T79c0ff0
Tff7b72def Td2a8fftest_get_status_includes_announce_fieldsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3DEFAULT_ANNOUNCE_INTERVAL_SECONDS
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3status Tff7b72= Te6edf3nodeTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffannounce_enabledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffannounce_interval_secondsTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3DEFAULT_ANNOUNCE_INTERVAL_SECONDS
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6fflast_announced_atTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72None
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3status Tff7b72= Te6edf3nodeTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6fflast_announced_atTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72not Tff7b72None
Tff7b72def Td2a8fftest_get_destination_hash_when_not_runningTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffget_destination_hashTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72class T56d364TestPageNodeLinkCallbacksTb4b4b4:
Tff7b72def Td2a8fftest_link_established_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3mock_link Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_linkTff7b72.Td2a8ffget_remote_identityTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72None
Te6edf3nodeTff7b72.Td2a8ff_link_establishedTb4b4b4(Te6edf3mock_linkTb4b4b4)
Tff7b72assert Te6edf3mock_link Tff7b72in Te6edf3nodeTff7b72.Td2a8ffactive_links
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_statsTb4b4b4[Ta5d6ff"Ta5d6fflinks_establishedTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1
Te6edf3mock_linkTff7b72.Td2a8ffset_link_closed_callbackTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_link_established_records_remote_identityTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3mock_link Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3rid Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ridTff7b72.Td2a8ffhash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ffcdTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)
Te6edf3mock_linkTff7b72.Td2a8ffget_remote_identityTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3rid
Te6edf3nodeTff7b72.Td2a8ff_link_establishedTb4b4b4(Te6edf3mock_linkTb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffunique_connectionsTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1
Tff7b72def Td2a8fftest_link_closed_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3mock_link Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffactive_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3mock_linkTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ff_link_closedTb4b4b4(Te6edf3mock_linkTb4b4b4)
Tff7b72assert Te6edf3mock_link Tff7b72not Tff7b72in Te6edf3nodeTff7b72.Td2a8ffactive_links
Tff7b72def Td2a8fftest_link_closed_callback_ignores_unknownTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ff_link_closedTb4b4b4(Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffactive_linksTb4b4b4) Tff7b72== T79c0ff0
Tff7b72class T56d364TestNormalizePageFilenameTb4b4b4:
Tff7b72def Td2a8fftest_accepts_allowed_extensionsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3normalize_page_filenameTb4b4b4(Ta5d6ff"Ta5d6ffa.muTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffa.muTa5d6ff"
Tff7b72assert Te6edf3normalize_page_filenameTb4b4b4(Ta5d6ff"Ta5d6ffb.mdTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffb.mdTa5d6ff"
Tff7b72assert Te6edf3normalize_page_filenameTb4b4b4(Ta5d6ff"Ta5d6ffc.txtTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffc.txtTa5d6ff"
Tff7b72assert Te6edf3normalize_page_filenameTb4b4b4(Ta5d6ff"Ta5d6ffd.htmlTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffd.htmlTa5d6ff"
Tff7b72assert Te6edf3normalize_page_filenameTb4b4b4(Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffx.muTa5d6ff"
Tff7b72def Td2a8fftest_rejects_bad_extensionTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3normalize_page_filenameTb4b4b4(Ta5d6ff"Ta5d6ffx.exeTa5d6ff"Tb4b4b4)
Tff7b72class T56d364TestPageNodeEdgeCasesTb4b4b4:
Tff7b72def Td2a8fftest_add_page_before_runningTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Tff7b72assert Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4)
Te6edf3name Tff7b72= Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffoffline.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffoffline.muTa5d6ff"
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Ta5d6ff"Ta5d6ffoffline.muTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/page/offline.muTa5d6ff" Tff7b72not Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_page_paths
Tff7b72def Td2a8fftest_add_file_before_runningTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Tff7b72assert Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4)
Te6edf3name Tff7b72= Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffoffline.txtTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffoffline.txtTa5d6ff"
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4, Ta5d6ff"Ta5d6ffoffline.txtTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/file/offline.txtTa5d6ff" Tff7b72not Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_file_paths
Tff7b72def Td2a8fftest_setup_registers_existing_pagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Ta5d6ff"Ta5d6ffpre.muTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffexistingTa5d6ff"Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/page/pre.muTa5d6ff" Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_page_paths
Tff7b72def Td2a8fftest_setup_registers_existing_filesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4, Ta5d6ff"Ta5d6ffpre.txtTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffexistingTa5d6ff"Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/file/pre.txtTa5d6ff" Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_file_paths
Tff7b72def Td2a8fftest_list_files_registers_manually_added_filesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4, Ta5d6ff"Ta5d6ffdropped.binTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffdroppedTa5d6ff"Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/file/dropped.binTa5d6ff" Tff7b72not Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_file_paths
Te6edf3nodeTff7b72.Td2a8fflist_filesTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/file/dropped.binTa5d6ff" Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_file_paths
Tff7b72def Td2a8fftest_path_traversal_blockedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3name Tff7b72= Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ff../../etc/passwdTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmaliciousTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffpasswd.muTa5d6ff"
Tff7b72assert Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3node_dirTb4b4b4, Ta5d6ff"Ta5d6ff..Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffetcTa5d6ff"Tb4b4b4)Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffskipifTb4b4b4(Te6edf3osTff7b72.Td2a8ffname Tff7b72== Ta5d6ff"Ta5d6ffntTa5d6ff"Tb4b4b4, Te6edf3reasonTff7b72=Ta5d6ff"Ta5d6ffsymlink jail oracle is POSIXTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_file_symlink_out_is_not_readable_or_overwrittenTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3bait_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3node_dirTb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffoutside-jailTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3bait_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3bait Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3bait_dirTb4b4b4, Ta5d6ff"Ta5d6ffsecret.binTa5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3baitTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffkeep-meTa5d6ff"Tb4b4b4)
Te6edf3link_name Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4, Ta5d6ff"Ta5d6ffescape.binTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffsymlinkTb4b4b4(Te6edf3baitTb4b4b4, Te6edf3link_nameTb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffread_hosted_fileTb4b4b4(Ta5d6ff"Ta5d6ffescape.binTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72assert Te6edf3nodeTff7b72.Td2a8fflist_filesTb4b4b4(Tb4b4b4) Tff7b72== Tb4b4b4[Tb4b4b4]
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_fileTb4b4b4(Ta5d6ff"Ta5d6ffescape.binTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4, Te6edf3matchTff7b72=Ta5d6ff"Ta5d6ffinvalid file nameTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffescape.binTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffoverwriteTa5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3baitTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72assert Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffkeep-meTa5d6ff"
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_file_responderTb4b4b4(Ta5d6ff"Ta5d6ffescape.binTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/file/escape.binTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72is Tff7b72None
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffskipifTb4b4b4(Te6edf3osTff7b72.Td2a8ffname Tff7b72== Ta5d6ff"Ta5d6ffntTa5d6ff"Tb4b4b4, Te6edf3reasonTff7b72=Ta5d6ff"Ta5d6ffsymlink jail oracle is POSIXTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_page_symlink_out_is_not_readable_or_overwrittenTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3bait_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3node_dirTb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffoutside-jailTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3bait_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3bait Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3bait_dirTb4b4b4, Ta5d6ff"Ta5d6ffsecret.muTa5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3baitTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffkeep-meTa5d6ff"Tb4b4b4)
Te6edf3bait_mode Tff7b72= Te6edf3osTff7b72.Td2a8ffstatTb4b4b4(Te6edf3baitTb4b4b4)Tff7b72.Td2a8ffst_mode
Te6edf3osTff7b72.Td2a8ffsymlinkTb4b4b4(Te6edf3baitTb4b4b4, Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Ta5d6ff"Ta5d6ffescape.muTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffget_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffescape.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffserve_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffescape.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72assert Te6edf3nodeTff7b72.Td2a8fflist_pagesTb4b4b4(Tb4b4b4) Tff7b72== Tb4b4b4[Tb4b4b4]
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_pageTb4b4b4(Ta5d6ff"Ta5d6ffescape.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4, Te6edf3matchTff7b72=Ta5d6ff"Ta5d6ffinvalid page nameTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffescape.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffoverwriteTa5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4, Te6edf3matchTff7b72=Ta5d6ff"Ta5d6ffpage not foundTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3nodeTff7b72.Td2a8ffset_page_executableTb4b4b4(Ta5d6ff"Ta5d6ffescape.muTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3baitTb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72assert Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffkeep-meTa5d6ff"
Tff7b72assert Te6edf3osTff7b72.Td2a8ffstatTb4b4b4(Te6edf3baitTb4b4b4)Tff7b72.Td2a8ffst_mode Tff7b72== Te6edf3bait_mode
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_page_responderTb4b4b4(Ta5d6ff"Ta5d6ffescape.muTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/page/escape.muTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72is Tff7b72None
Tff7b72class T56d364TestPageNodeExecutablePagesTb4b4b4:
Tff7b72def Td2a8fftest_executable_disabled_serves_static_even_when_chmod_xTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rns
Tb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3script Tff7b72= Ta5d6ff"Ta5d6ff#!/usr/bin/env python3Tffea00\nTa5d6ffprint(Ta5d6ff'Ta5d6ffdynamicTa5d6ff'Ta5d6ff)Tffea00\nTa5d6ff"
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4, Te6edf3scriptTb4b4b4, Te6edf3executableTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffserve_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4) Tff7b72== Te6edf3scriptTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_chmod_x_without_config_name_still_runs_on_posixTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffname Tff7b72== Ta5d6ff"Ta5d6ffntTa5d6ff"Tb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6ff"Ta5d6ffPOSIX chmod execute bit is not a Windows markerTa5d6ff"Tb4b4b4)
Tff7b72import T7ee787stat
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_executable_pages_enabledTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3script Tff7b72= Ta5d6ff"Ta5d6ff#!/usr/bin/env python3Tffea00\nTa5d6ffprint(Ta5d6ff'Ta5d6ffchmod-onlyTa5d6ff'Ta5d6ff)Tffea00\nTa5d6ff"
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4, Te6edf3scriptTb4b4b4)
Te6edf3page_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffchmodTb4b4b4(
Te6edf3page_pathTb4b4b4,
Te6edf3osTff7b72.Td2a8ffstatTb4b4b4(Te6edf3page_pathTb4b4b4)Tff7b72.Td2a8ffst_mode Tff7b72| Te6edf3statTff7b72.Td2a8ffS_IXUSR Tff7b72| Te6edf3statTff7b72.Td2a8ffS_IXGRP Tff7b72| Te6edf3statTff7b72.Td2a8ffS_IXOTHTb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffserve_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffchmod-onlyTffea00\nTa5d6ff"
Tff7b72def Td2a8fftest_executable_passes_env_varsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_executable_pages_enabledTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3script Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ff#!/usr/bin/env python3Tffea00\nTa5d6ff"
Ta5d6ff"Ta5d6ffimport osTffea00\nTa5d6ff"
Ta5d6ff"Ta5d6ffprint(os.environ.get(Ta5d6ff'Ta5d6ffvar_nameTa5d6ff'Ta5d6ff, Ta5d6ff'Ta5d6ff'Ta5d6ff), end=Ta5d6ff'Ta5d6ff'Ta5d6ff)Tffea00\nTa5d6ff"
Ta5d6ff"Ta5d6ffprint(Ta5d6ff'Ta5d6ff|Ta5d6ff'Ta5d6ff, os.environ.get(Ta5d6ff'Ta5d6fffield_formTa5d6ff'Ta5d6ff, Ta5d6ff'Ta5d6ff'Ta5d6ff), end=Ta5d6ff'Ta5d6ff'Ta5d6ff)Tffea00\nTa5d6ff"
Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffenv.muTa5d6ff"Tb4b4b4, Te6edf3scriptTb4b4b4, Te6edf3executableTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3result Tff7b72= Te6edf3nodeTff7b72.Td2a8ffserve_page_contentTb4b4b4(
Ta5d6ff"Ta5d6ffenv.muTa5d6ff"Tb4b4b4,
Te6edf3dataTff7b72=Tb4b4b4{Ta5d6ff"Ta5d6ffvar_nameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffield_formTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffsubmitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffignoredTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4}Tb4b4b4,
Te6edf3link_idTff7b72=Ta5d6ffbTa5d6ff"Tffea00\x01Ta5d6ff" Tff7b72* T79c0ff16Tb4b4b4,
Te6edf3remote_identityTff7b72=Te6edf3MagicMockTb4b4b4(Tffa657hashTff7b72=Ta5d6ffbTa5d6ff"Tffea00\x02Ta5d6ff" Tff7b72* T79c0ff16Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72assert Ta5d6ffbTa5d6ff"Ta5d6ffaliceTa5d6ff" Tff7b72in Te6edf3result
Tff7b72assert Ta5d6ffbTa5d6ff"Ta5d6ffsubmitTa5d6ff" Tff7b72in Te6edf3result
Tff7b72def Td2a8fftest_executable_timeout_returns_error_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_executable_pages_enabledTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3script Tff7b72= Ta5d6ff"Ta5d6ff#!/usr/bin/env python3Tffea00\nTa5d6ffimport timeTffea00\nTa5d6fftime.sleep(30)Tffea00\nTa5d6ff"
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffslow.muTa5d6ff"Tb4b4b4, Te6edf3scriptTb4b4b4, Te6edf3executableTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3result Tff7b72= Te6edf3nodeTff7b72.Td2a8ffserve_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffslow.muTa5d6ff"Tb4b4b4)
Tff7b72assert Ta5d6ffbTa5d6ff"Ta5d6ff>Page Generation FailedTa5d6ff" Tff7b72in Te6edf3result
Tff7b72assert Ta5d6ffbTa5d6ff"Ta5d6fftimed outTa5d6ff" Tff7b72in Te6edf3resultTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_get_page_content_never_executesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_executable_pages_enabledTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3script Tff7b72= Ta5d6ff"Ta5d6ff#!/usr/bin/env python3Tffea00\nTa5d6ffprint(Ta5d6ff'Ta5d6ffdynamicTa5d6ff'Ta5d6ff)Tffea00\nTa5d6ff"
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4, Te6edf3scriptTb4b4b4, Te6edf3executableTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffget_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4) Tff7b72== Te6edf3script
Tff7b72def Td2a8fftest_windows_platform_runs_via_shebangTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_executable_pages_enabledTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3script Tff7b72= Ta5d6ff"Ta5d6ff#!/usr/bin/env python3Tffea00\nTa5d6ffprint(Ta5d6ff'Ta5d6ffwindows-dynamicTa5d6ff'Ta5d6ff)Tffea00\nTa5d6ff"
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4, Te6edf3scriptTb4b4b4, Te6edf3executableTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.page_node._is_windows_platformTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3nodeTff7b72.Td2a8ffserve_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3result Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffwindows-dynamicTffea00\nTa5d6ff"
Tff7b72def Td2a8fftest_windows_unmarked_page_stays_staticTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_executable_pages_enabledTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3script Tff7b72= Ta5d6ff"Ta5d6ff#!/usr/bin/env python3Tffea00\nTa5d6ffprint(Ta5d6ff'Ta5d6ffshould-not-runTa5d6ff'Ta5d6ff)Tffea00\nTa5d6ff"
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffstatic.muTa5d6ff"Tb4b4b4, Te6edf3scriptTb4b4b4)
Tff7b72with Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.page_node._is_windows_platformTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffis_page_executableTb4b4b4(Ta5d6ff"Ta5d6ffstatic.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Te6edf3result Tff7b72= Te6edf3nodeTff7b72.Td2a8ffserve_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffstatic.muTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3result Tff7b72== Te6edf3scriptTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_windows_missing_shebang_returns_error_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_executable_pages_enabledTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffplain.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHello staticTffea00\nTa5d6ff"Tb4b4b4, Te6edf3executableTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.page_node._is_windows_platformTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3nodeTff7b72.Td2a8ffserve_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffplain.muTa5d6ff"Tb4b4b4)
Tff7b72assert Ta5d6ffbTa5d6ff"Ta5d6ff>Page Generation FailedTa5d6ff" Tff7b72in Te6edf3result
Tff7b72assert Ta5d6ffbTa5d6ff"Ta5d6ffshebangTa5d6ff" Tff7b72in Te6edf3resultTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_set_page_executable_round_tripTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6fftoggle.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffstaticTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffis_page_executableTb4b4b4(Ta5d6ff"Ta5d6fftoggle.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Te6edf3nodeTff7b72.Td2a8ffset_page_executableTb4b4b4(Ta5d6ff"Ta5d6fftoggle.muTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffis_page_executableTb4b4b4(Ta5d6ff"Ta5d6fftoggle.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72True
Te6edf3nodeTff7b72.Td2a8ffset_page_executableTb4b4b4(Ta5d6ff"Ta5d6fftoggle.muTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffis_page_executableTb4b4b4(Ta5d6ff"Ta5d6fftoggle.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_remove_page_clears_executable_nameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffgone.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffstaticTa5d6ff"Tb4b4b4, Te6edf3executableTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_pageTb4b4b4(Ta5d6ff"Ta5d6ffgone.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72True
Te6edf3config Tff7b72= Te6edf3PageNodeTff7b72.Td2a8ffload_configTb4b4b4(Te6edf3node_dirTb4b4b4)
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffexecutable_page_namesTa5d6ff"Tb4b4b4] Tff7b72== Tb4b4b4[Tb4b4b4]
Tff7b72def Td2a8fftest_page_responder_uses_serve_page_contentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffset_executable_pages_enabledTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3script Tff7b72= Ta5d6ff"Ta5d6ff#!/usr/bin/env python3Tffea00\nTa5d6ffprint(Ta5d6ff'Ta5d6fffrom-responderTa5d6ff'Ta5d6ff)Tffea00\nTa5d6ff"
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4, Te6edf3scriptTb4b4b4, Te6edf3executableTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_page_responderTb4b4b4(Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3responderTb4b4b4(
Ta5d6ff"Ta5d6ff/page/dyn.muTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffvar_xTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffreq1Ta5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Tffea00\xabTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0
Tb4b4b4)
Tff7b72assert Te6edf3result Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6fffrom-responderTffea00\nTa5d6ff"
Tff7b72class T56d364TestPageShebangWindowsTb4b4b4:
Tff7b72def Td2a8fftest_parse_env_python3Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3_parse_page_shebang
Te6edf3page Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"
Te6edf3pageTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ff#!/usr/bin/env python3Tffea00\nTa5d6ffprint(1)Tffea00\nTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3_parse_page_shebangTb4b4b4(Tffa657strTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4) Tff7b72== Tb4b4b4(Ta5d6ff"Ta5d6ffpython3Ta5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8fftest_parse_env_dash_sTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3_parse_page_shebang
Te6edf3page Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"
Te6edf3pageTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ff#!/usr/bin/env -S python3 -uTffea00\nTa5d6ffprint(1)Tffea00\nTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3_parse_page_shebangTb4b4b4(Tffa657strTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4) Tff7b72== Tb4b4b4(Ta5d6ff"Ta5d6ffpython3Ta5d6ff"Tb4b4b4, Tb4b4b4[Ta5d6ff"Ta5d6ff-uTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8fftest_parse_unix_python_pathTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3_parse_page_shebang
Te6edf3page Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"
Te6edf3pageTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ff#!/usr/bin/python3Tffea00\nTa5d6ffprint(1)Tffea00\nTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3_parse_page_shebangTb4b4b4(Tffa657strTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4) Tff7b72== Tb4b4b4(Ta5d6ff"Ta5d6ff/usr/bin/python3Ta5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8fftest_parse_missing_shebangTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3_parse_page_shebang
Te6edf3page Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"
Te6edf3pageTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ffHelloTffea00\nTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3_parse_page_shebangTb4b4b4(Tffa657strTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_windows_command_resolves_python3Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3_windows_page_command
Te6edf3page Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"
Te6edf3pageTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ff#!/usr/bin/env python3Tffea00\nTa5d6ffprint(1)Tffea00\nTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3command Tff7b72= Te6edf3_windows_page_commandTb4b4b4(Tffa657strTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3command Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3commandTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72assert Te6edf3commandTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4] Tff7b72== Tffa657strTb4b4b4(Te6edf3pageTb4b4b4)
Tff7b72def Td2a8fftest_normalize_executable_names_rejects_bad_entriesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3_normalize_executable_page_names
Te6edf3names Tff7b72= Te6edf3_normalize_executable_page_namesTb4b4b4(
Tb4b4b4[Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff../x.exeTa5d6ff"Tb4b4b4, T79c0ff12Tb4b4b4, Ta5d6ff"Ta5d6ffok.mdTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3names Tff7b72== Tb4b4b4[Ta5d6ff"Ta5d6ffdyn.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffok.mdTa5d6ff"Tb4b4b4]
Served by rngit 1.4.2 - Generated in 0.06s